package com.aust.dynamicProxy.test2;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 处理器
 * 自定义 InvocationHandler
 * 接口的 invoke() 方法会在代理对象调用任何方法时执行
 */
public class LogHandler implements InvocationHandler {

    private Object target;

    public LogHandler(Object target) {
        this.target = target;
    }

    /**
     * InvocationHandler 是 Java 动态代理机制的核心接口，位于包 java.lang.reflect 中。
     * 所有通过 Proxy.newProxyInstance() 生成的代理对象，其方法调用，最终都会被转发到 InvocationHandler.invoke() 方法中处理。
     * InvocationHandler 理解为 代理行为的控制中心，它决定了代理对象调用方法时要做什么。
     * 参数名	类型	        含义
     * proxy	Object	    当前这个代理对象（不是原始对象）
     * method	Method	    被调用的方法对象（通过反射获得方法名、参数、注解等）
     * args	    Object[]	方法调用时传入的参数数组，可能为 null（无参方法）
     */
    /**
     * `InvocationHandler` 是动态代理的核心，用来定义“代理行为”；
     * `invoke()` 方法捕捉所有对代理对象的方法调用，并通过反射调用真实方法，同时可插入增强逻辑。
     */
    /**
     * proxy 有什么用？
     * 通常不会直接用，但你可以通过它：
     * 判断调用者是谁（比如多个代理共用一个 handler 时做区分）
     * 用它调用别的接口方法（递归调用，嵌套代理）
     * 做校验或安全控制
     * <p>
     * proxy 是当前生成的代理类对象（$Proxy0），代表调用者本身。
     * method 是你调用的方法，通过反射你可以获取方法名、注解、参数等，并用于反射调用原始对象的方法。
     * args 是实际传入的参数数组，方法无参数时可能为 null。
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("调用方法" + method.getName());
        /**
         * 反射调用目标方法
         */
        Object result = method.invoke(target, args);
        System.out.println("方法执行完毕");
        return result;
    }
}
